/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.edu.fatec.ads.facade;

import br.edu.fatec.ads.bo.BusinessObjectAutor;
import br.edu.fatec.ads.bo.BusinessObjectCategoria;
import br.edu.fatec.ads.bo.BusinessObjectEmprestimo;
import br.edu.fatec.ads.bo.BusinessObjectLivro;
import br.edu.fatec.ads.classes.Livro;
import br.edu.fatec.ads.util.ComboBoxItem;
import java.util.Collections;
import java.util.List;
import org.hibernate.HibernateException;

/**
 *
 * @author Ubirajara
 */
public class FacadeLivro {

    private static FacadeLivro singleton = null;
    private BusinessObjectLivro regraNegocio = null;

    private FacadeLivro() {
        regraNegocio = new BusinessObjectLivro();
    }

    public static FacadeLivro getInstance(){
        if(singleton == null){
            singleton = new FacadeLivro();
        }

        return singleton;
    }

    public void inserir(Livro livro, List<ComboBoxItem> categorias, List<ComboBoxItem> autores)
        throws HibernateException{

        BusinessObjectCategoria regraNegocioCategoria = new BusinessObjectCategoria();
        BusinessObjectAutor regraNegocioAutor = new BusinessObjectAutor();
        
        if(regraNegocio.hasQtdeMinimaISBN(livro)){

            regraNegocio.beginTransaction();

            try{
                livro.setAutores(regraNegocioAutor.recuperarAutores(autores));
                livro.setCategorias(regraNegocioCategoria.recuperarCategorias(categorias));

                regraNegocio.inserir(livro);

                regraNegocio.commitTransaction();
            }catch(HibernateException cause){
                cause.printStackTrace();
                regraNegocio.rollbackTransaction();

                throw new HibernateException("Problemas ao inserir livro: " + cause.getMessage());
            }
        }else{
            throw new HibernateException("O código de ISBN deve ter ao menos 10 e 13 digitos!");
        }
    }

    public List<Livro> recuperarLivrosPorCriterio(Livro livro){
        List<Livro> livrosRecuperados = Collections.EMPTY_LIST;
        
        regraNegocio.beginTransaction();

        try{
            livrosRecuperados = regraNegocio.recuperarLivrosPorCriterio(livro);

            regraNegocio.commitTransaction();
        }catch(HibernateException cause){
            cause.printStackTrace();

            regraNegocio.rollbackTransaction();
        }

        return livrosRecuperados;
    }


    public List<Livro> recuperarLivrosPorAutor(int codigoAutor){
        BusinessObjectAutor regraNegocioAutor = new BusinessObjectAutor();
        List<Livro> livrosRecuperados = Collections.EMPTY_LIST;

        regraNegocioAutor.beginTransaction();

        try{
            livrosRecuperados = regraNegocioAutor.recuperarLivrosPorAutor(codigoAutor);

            regraNegocioAutor.commitTransaction();
            regraNegocio.clearSession();
        }catch(HibernateException cause){
            cause.printStackTrace();

            regraNegocioAutor.rollbackTransaction();
        }catch(NullPointerException cause){
            cause.printStackTrace();

            regraNegocioAutor.rollbackTransaction();
        }

        return livrosRecuperados;
    }

    public Livro recuperarLivro(int codigoTombo){
        Livro livroRecuperado = null;

        regraNegocio.beginTransaction();

        try{
            livroRecuperado = regraNegocio.getLivro(codigoTombo);

            regraNegocio.commitTransaction();
        }catch(HibernateException cause){
            cause.printStackTrace();

            regraNegocio.rollbackTransaction();
        }

        return livroRecuperado;
    }

    public void excluirLivro(Livro livro)
        throws HibernateException{
        
        BusinessObjectEmprestimo regraNegocioEmprestimo =
                new BusinessObjectEmprestimo();

        regraNegocio.beginTransaction();

        try{
            if(!regraNegocioEmprestimo.hasEmprestimosAtivos(livro)){
                regraNegocio.excluir(livro);
            }else{
                throw new HibernateException("Não é possível efetuar a exclusão do livro, pois há empréstimos ativos vinculados ao mesmo");
            }

            regraNegocio.commitTransaction();
        }catch(HibernateException cause){
            regraNegocio.rollbackTransaction();

            throw cause;
        }

    }

}